/*
 * Copyright 2006-2007 S W McIlroy
 * Licensed  under the  Apache License,  Version 2.0  (the "License");
 * you may not use  this file  except in  compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed  under the  License is distributed on an "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
 * implied.
 *
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.mockfu;

class Constraint
{

    private final Object argument;
    private final Matcher<?> matcher;

    public Constraint( Object argument, Matcher<?> matcher )
    {
        this.argument = argument;
        this.matcher = matcher;
    }

    public boolean isForArgument( Object argument )
    {
        if( this.argument == argument )
            return true;
        if( this.argument == null || argument == null )
            return false;
        if( this.argument.getClass() != argument.getClass() )
            return false;

        if( argument instanceof Boolean )
        {
            return ((Boolean) argument) == ((Boolean) this.argument).booleanValue();
        }
        if( argument instanceof Number )
        {
            Number thisNumber = (Number) this.argument;
            Number thatNumber = (Number) argument;

            if( argument instanceof Float )
                return thisNumber.floatValue() == thatNumber.floatValue();
            else if( argument instanceof Double )
                return thisNumber.doubleValue() == thatNumber.doubleValue();
            else
                return thisNumber.longValue() == thatNumber.longValue();
        }

        return false;
    }

    @Override
    public String toString()
    {
        return matcher.toString();
    }

    public Matcher<Object> getMatcher()
    {
        return (Matcher<Object>)matcher;
    }
}
